package com.tensquare.friend.service;

import com.tensquare.friend.client.UserClient;
import com.tensquare.friend.dao.FriendDao;
import com.tensquare.friend.dao.NoFriendDao;
import com.tensquare.friend.pojo.Friend;
import com.tensquare.friend.pojo.NoFriend;
import entity.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class FriendService {
    @Autowired
    private FriendDao friendDao;
    @Autowired
    private NoFriendDao noFriendDao;
    @Autowired
    private UserClient userClient;

    //添加好友
    public void addFriend(String userId, String friendId) {
        if (friendDao.getCountByUserIdAndFriendId(userId,friendId)>0) {//已经添加好友
            throw new RuntimeException("请不要重复添加");
        }
        //创建Friend对象
        Friend friend = new Friend();
        friend.setFriendid(friendId);
        friend.setUserid(userId);
        friend.setIslike("0");  //单项喜欢
        //调用Dao保存
        friendDao.save(friend);
        //判断是否为双向喜欢
        Long count = friendDao.getCountByUserIdAndFriendId(friendId,userId);
        if (count > 0) {  //双向喜欢
            friendDao.updateIsLike(friendId,userId,"1");
            friendDao.updateIsLike(userId,friendId,"1");
        }
        //添加好友(你关注他了)时会修改双方在用户表中的关注数和粉丝数,利用feign进行远程调用tensquare-user服务

        //远程调用 => 维护用户表的粉丝数量/关注数量
        //远程调用: 当远程调用的服务出现问题时,事务无法捕捉到出现的错误,所以
        //需要根据返回值判断服务是否执行成功,执行失败,主动抛出一个异常,从而保证整个方法事务都会回滚
        Result followCount = userClient.changeFollowCount(userId, 1);
        Result fansCount = userClient.changeFansCount(friendId, 1);
        if (!followCount.getFlag() || !fansCount.getFlag()) {
            //两个微服务中,其中一个或者全部调用失败
            throw new RuntimeException("操作失败");
        }
    }


    //添加非好友
    public void addNoFriend(String userId, String friendId) {
        //创建Friend对象
        NoFriend noFriend = new NoFriend();
        noFriend.setFriendid(friendId);
        noFriend.setUserid(userId);
        //调用Dao保存
        noFriendDao.save(noFriend);
    }


    //删除好友
    public void delFriend(String userId, String friendId) {
        //删除Friend表记录
        friendDao.deleteByFriendidAndAndUserid(userId,friendId);
        //修改另一方的islike属性为0   (如果只是单向喜欢,该修改无效)
        friendDao.updateIsLike(friendId,userId,"0");
        //向nofriend表添加记录
        addNoFriend(userId,friendId);
        //删除好友(你不关注他了)时会修改双方在用户表中的关注数和粉丝数,利用feign进行远程调用tensquare-user服务

        //远程调用 => 维护用户表的粉丝数量/关注数量
        //远程调用: 当远程调用的服务出现问题时,事务无法捕捉到出现的错误,所以
        //需要根据返回值判断服务是否执行成功,执行失败,主动抛出一个异常,从而保证整个方法事务都会回滚
        Result followCount = userClient.changeFollowCount(userId, -1);
        Result fansCount = userClient.changeFansCount(friendId, -1);
        if (!followCount.getFlag() || !fansCount.getFlag()) {
            //两个微服务中,其中一个或者全部调用失败
            throw new RuntimeException("操作失败");
        }
    }


}
